﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//编译链接


//               翻译环境
//test.c------------------------->test.exe
//         编译        +       链接
//预处理、编译、汇编          多个test.o经过连接器处理，生成可执行程序
//预处理
// |
// V
//gcc命令：gcc test.c -E -o test.i
//预处理与文本操作，预处理的指令有关
//1.头文件的包含（#include）
//2.注释的删除
//3.#define定义的符号的替换

//编译
// |
// V
//gcc命令：gcc test.i -S,生成一个.s的文件
//把C语言代码翻译成汇编语言
//1.语法分析
//2.词法分析
//3.语义分析
//4.符号汇总

//汇编
// |
// V
//gcc命令：gcc test.s -c,生成一个.o的文件(目标文件(二进制文件)
//把汇编代码转换成二进制指令
//1.合并段表
//2.符号表的合并和重定位


 //int main()
 //{
 //    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
 //    int i = 0;
 //    for(i=0; i<10; i++)
 //    {
 //        printf("%d-----%s,%s,%s,line=%d\n", arr[i],__FILE__, __DATE__,__TIME__,__LINE__);
 // //什么文件打开的，什么日期，什么时间打开的，当前行号
 //    }
 //    return 0;
 //}

// int main()
// {
// 	printf("%d\n", __STDC__);
// 	return 0;
// }


//补充：其实编译器在代码编译的时候，会对函数和变量名重命名
//在C语言中重命名的规则基本就是：加_,C++中会更复杂
//int main()
//{
//	printf("%s\n", __FUNCTION__);//main
//	printf("%s\n", __FUNCDNAME__);//_main
//}


//#define MAX 1000
//#define reg register          //为 register这个关键字，创建一个简短的名字
//#define do_forever for(;;)     //用更形象的符号来替换一种实现
//#define CASE break;case        //在写case语句的时候自动把 break写上。
//// 如果定义的 stuff过长，可以分成几行写，除了最后一行外，每行的后面都加一个反斜杠(续行符)。
//#define DEBUG_PRINT printf("file:%s\tline:%d\t \
//                          date:%s\ttime:%s\n" ,\
//                          __FILE__,__LINE__ ,       \
//                          __DATE__,__TIME__ )


// #define MAX 1000

// int main()
// {
// 	//int a = MAX;
//     int a = 0;
//     if(1)
//         a = MAX;
//     else
//         a = -1;

// 	return 0;
// }

// #define MAX 1000;
// int main()
// {
//     int arr[MAX];

//     return 0;
// }


// #define SQUARE(x)  ((x)*(x))

// int main()
// {
//     printf("%d\n", SQUARE(1+7));

//     return 0;
// }

// #define DOUBLE(x) ((x)+(x))

// int main()
// {
//     int a = 10*DOUBLE(4);
//     printf("%d\n", a);

//     return 0;
// }


// #define MAX(X,Y) ((X)>(Y)?(X):(Y))

// int Max(int x, int y)
// {
//     return x>y?x:y;
// }

// #define M 100


// int main()
// {
//     int m = MAX(M, 5);
//     printf("%d\n", m);

//     m = Max(3,5);
//     printf("%d\n", m);
//     return 0;
// }

// #define print_format(num, format) \
//             printf("the value of "#num" is "format, num)
//#让传过来的参数不是替换过去，让宏的参数不是参数，变成参数所对应的字符串

// int main()
// {
//     int a = 10;
//     print_format(a, "%d\n");
//     //printf("the value of a is %d\n", a);

//     int b = 20;
//     print_format(b, "%d\n");
//     //printf("the value of b is %d\n", b);

//     float f = 3.14f;
//     print_format(f, "%f\n");
//     //printf("the value of f is %f\n", f);

//     return 0;
// }

// int main()
// {
//     printf("hello world\n");
//     printf("hello " "world\n");

//     return 0;
// }


// int Class110 = 2023;

// #define CAT(x,y) x##y
// //Class110
// int main()
// {
//     printf("%d\n", CAT(Class, 110));

//     return 0;
// }
//


// int main()
// {
//     //代码1
//     int a = 10;
//     int b = a+1;//b得到是11,a还是10

//     //代码2
//     int a = 10;
//     int b = ++a;//b得到了11，但是a也变了，变成了11
//     //代码2是有副作用的

//     return 0;
// }

//int Max(int x, int y)
//{
//    return x > y ? x : y;
//}
//
//#define MAX(X,Y) ((X)>(Y)?(X):(Y))
//
//int main()
//{
//    int a = 3;
//    int b = 5;
//    //int c = MAX(a++, b++);
//    int c = Max(a++, b++);
//    //int c = ((a++)>(b++)?(a++):(b++));
//    //         3      5    
//    printf("%d\n", c);//6
//    printf("%d\n", a);//4
//    printf("%d\n", b);//7
//    return 0;
//}